package com.eian.boot.metrics.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.ArrayList;
import java.util.List;

/**
 * 性能监控配置属性
 *
 * @author alex.meng
 */
@Data
@ConfigurationProperties(prefix = "eian.metrics")
public class MetricsProperties {

    /**
     * 是否启用性能监控
     */
    private boolean enabled = true;

    /**
     * 日志配置
     */
    private LogConfig log = new LogConfig();

    /**
     * 扫描配置
     */
    private ScanConfig scan = new ScanConfig();

    /**
     * 性能配置
     */
    private PerformanceConfig performance = new PerformanceConfig();

    /**
     * 数据收集配置
     */
    private CollectConfig collect = new CollectConfig();

    /**
     * 告警配置
     */
    private AlertConfig alert = new AlertConfig();

    @Data
    public static class LogConfig {
        /**
         * 是否启用日志输出
         */
        private boolean enabled = true;

        /**
         * 日志级别：DEBUG, INFO, WARN, ERROR
         */
        private String level = "INFO";

        /**
         * 是否输出详细信息
         */
        private boolean verbose = false;

        /**
         * 日志格式
         */
        private String pattern = "[METRICS] {method} executed in {duration}ms";
    }

    @Data
    public static class ScanConfig {
        /**
         * 是否启用包扫描监控
         */
        private boolean enabled = false;

        /**
         * 扫描的基础包路径
         */
        private List<String> basePackages = new ArrayList<>();

        /**
         * 包含的类名模式
         */
        private List<String> includeClassPatterns = List.of(".*Service", ".*Controller", ".*Component");

        /**
         * 排除的类名模式
         */
        private List<String> excludeClassPatterns = List.of(".*Test.*", ".*Config.*");

        /**
         * 包含的方法名模式
         */
        private List<String> includeMethodPatterns = List.of(".*");

        /**
         * 排除的方法名模式
         */
        private List<String> excludeMethodPatterns = List.of("get.*", "set.*", "is.*", "toString", "hashCode",
                "equals");
    }

    @Data
    public static class PerformanceConfig {
        /**
         * 慢方法阈值（毫秒）
         */
        private long slowThreshold = 500;

        /**
         * 采样率（0.0-1.0）
         */
        private double sampleRate = 1.0;

        /**
         * 是否记录方法参数
         */
        private boolean recordArgs = false;

        /**
         * 是否记录返回值
         */
        private boolean recordResult = false;

        /**
         * 最大记录的参数/返回值长度
         */
        private int maxRecordLength = 1000;

        /**
         * 是否启用异常监控
         */
        private boolean exceptionMonitoring = true;

        /**
         * 是否启用内存监控
         */
        private boolean memoryMonitoring = false;
    }

    @Data
    public static class CollectConfig {
        /**
         * 是否启用数据收集
         * 默认关闭，仅做日志输出不调用任何方法和注入PerformanceCollector依赖
         */
        private boolean enabled = false;
    }

    @Data
    public static class AlertConfig {
        /**
         * 是否启用告警
         */
        private boolean enabled = false;

        /**
         * 告警阈值（毫秒）
         */
        private long threshold = 5000;

        /**
         * 告警频率限制（秒）
         */
        private int rateLimitSeconds = 300;

        /**
         * 告警接收邮箱
         */
        private List<String> emails = new ArrayList<>();
    }

}
